package com.desire.test;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * @author desire
 */
public class _17_文件操作 {
    public static void main(String[] args) throws IOException {
        // RandomAccessFile对象
        File file = new File("C:\\Users\\desire\\Desktop\\javaProject\\01-javaBase\\src\\main\\resources\\filetest.txt");
        RandomAccessFile raf = new RandomAccessFile(file, "rw");
        raf.skipBytes((int) raf.length() - 1);
        System.out.println(raf.readByte());
    }

    public static void main4(String[] args) throws IOException {
        //建立文件输出流，用来写入内容，true,追加模式
        try (var fos = new FileOutputStream("C:\\Users\\desire\\Desktop\\javaProject\\01-javaBase\\src\\main\\resources\\filetest.txt", true)) {
            fos.write(String.format("hellop\r\n", System.currentTimeMillis()).getBytes());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void main3(String[] args) {
        String file = "C:\\Users\\desire\\Desktop\\javaProject\\01-javaBase\\src\\main\\resources\\filetest.txt";

        // try with 语句 自动关闭流
        try (var fis = new FileInputStream(file)) {
            // System.out.println(new String(fis.readAllBytes(), StandardCharsets.UTF_8));

            byte[] buf = new byte[1024];
            int len = 0;
            while ((len = fis.read(buf)) > 0) {
                System.out.println(new String(buf, StandardCharsets.UTF_8));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void main1(String[] args) throws IOException {
        //建立文件
        try (var fos = new FileOutputStream("C:\\Users\\desire\\Desktop\\javaProject\\01-javaBase\\src\\main\\resources\\filetest.txt")) {
            for (int i = 0; i < 3; i++) {
                // 文本
                var uuid = UUID.randomUUID().toString().toLowerCase().concat(".jpg\r\n");
                // 将文本以字节流的形式写进去
                fos.write(uuid.getBytes());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        /*
        1.delete()方法：
            当调用delete()方法时，直接删除文件，不管该文件是否存在，一经调用立即执行；
        2.deleteOnExit()方法：
            当调用deleteOnExit()方法时，只是相当于对deleteOnExit（）作一个声明，当程序运行结束，
            JVM终止时才真正调用deleteOnExit()方法实现删除操作。即该方法是将删除的命令缓存了一下，到服务停止的时候再进行操作
        */
        //删除文件
        var f = new File("C:\\Users\\desire\\Desktop\\javaProject\\01-javaBase\\src\\main\\resources\\filetest.txt");
        //if (f.exists()) f.deleteOnExit();

        // 文件名更改  也可实现文件的移动相当于linux mv   (相当于创建了一个新的文件)
        boolean rename = f.renameTo(new File("C:\\Users\\desire\\Desktop\\javaProject\\01-javaBase\\src\\main\\resources\\file.txt"));
        System.out.println(rename);

        // 文件复制
        try (var b = new FileOutputStream("C:\\Users\\desire\\Desktop\\javaProject\\01-javaBase\\src\\main\\resources\\abcuuu33.txt"); var a = new FileInputStream("C:\\Users\\desire\\Desktop\\javaProject\\01-javaBase\\src\\main\\resources\\file.txt")) {
            // Since: 9  java9 的新功能
            // b.write(a.readAllBytes());

            // Since: 9  也是java9的
            //a.transferTo(b);


            // 根据 transferTo的源码自己修改  可以有效地控制缓冲区的大小
            byte[] buffer = new byte[1024 * 8];
            int read;
            while ((read = a.read(buffer, 0, buffer.length)) >= 0) {
                b.write(buffer, 0, read);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}
